﻿using Dao;
using Interface.BO;
using Interface.DAO;
using JMI_Nucleo.JMIProvider;
using OR;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.IO;
using System.Xml;

namespace BO
{
    public class Usuario : IUsuario
    {
        #region Classe para controle do TempXML Usuario
        public class XMLUsuario
        {
            private static int _codigo;

            public static int Codigo
            {
                get { return _codigo; }
                set { _codigo = value; }
            }

            public static short GetCodigoUsuario()
            {
                if (!ExiteXMLTemp())
                    GravaXML();

                short codigo = 1;

                string nomeArquivo = Path.Combine(Environment.CurrentDirectory, "TempXML.xml");

                if (File.Exists(nomeArquivo))
                {
                    XmlTextReader leitor = new XmlTextReader(nomeArquivo);

                    while (leitor.Read())
                    {
                        if (leitor.NodeType == XmlNodeType.Text)
                            codigo = Convert.ToInt16(leitor.Value);
                    }
                    leitor.Close();
                }
                return codigo;
            }

            public static void GravaXML()
            {
                if (Codigo == 0) { return; }
                string nomeArquivo = Path.Combine(Environment.CurrentDirectory, "TempXML.xml");
             
                XmlTextWriter escritor = new XmlTextWriter(nomeArquivo, System.Text.Encoding.UTF8);

                escritor.Formatting = Formatting.Indented;

                escritor.WriteStartDocument();

                escritor.WriteStartElement("InfoEmpresa");

                escritor.WriteStartElement("Dados");
                escritor.WriteElementString("codigousuario", Codigo.ToString());

                escritor.WriteEndElement();

                escritor.WriteEndElement();

                escritor.WriteEndDocument();

                escritor.Close();
            }

            public static bool ExiteXMLTemp()
            {
                bool existe = false;

                string nomeArquivo = Path.Combine(Environment.CurrentDirectory, "TempXML.xml");
                if (File.Exists(nomeArquivo))
                    existe = true;
                return existe;
            }
        }
        #endregion

        private string msgErro;
        IUsuarioDao<mUsuario> dao;
         
        public Usuario()
        {
            dao = DaoFactory<UsuarioDao>.Create();
        }

        public string MsgErro { get { return msgErro; } }

        private bool Valida(mUsuario _mUsuario)
        {
            bool sucesso = true;

            if (String.IsNullOrEmpty(_mUsuario.Nome))
            {
                msgErro = "Nome, Campo Obrigatório.";
                sucesso = false;
            }
            else if (_mUsuario.Nome.Length > 45)
            {
                msgErro = "Nome, Campo deve possuir no máximo 45 caractr(es).";
                sucesso = false;
            }
            else if (String.IsNullOrEmpty(_mUsuario.Senha))
            {
                msgErro = "Senha, Campo Obrigatório.";
                sucesso = false;
            }
            else if (_mUsuario.Senha.Length > 6)
            {
                msgErro = "Senha, Campo deve possuir no máximo 6 caractr(es).";
                sucesso = false;
            }
            else if (_mUsuario.Senha.Length < 6)
            {
                msgErro = "Senha, Campo deve possuir no minimo 6 caractr(es).";
                sucesso = false;
            }
            else if (_mUsuario.Funcionario.Codigo == 0 && _mUsuario.Administrador == false)
            {
                msgErro = "Funcionário, Campo Obrigatório.";
                sucesso = false;
            }
            else if (_mUsuario.Administrador)
            {
                if (dao.ExisteAdministradorCadastro(_mUsuario.CodigoEmpresa))
                {
                    msgErro = "Já existe um administrador cadastrado.";
                    sucesso = false;
                }
            }
            return sucesso;
        }

        public bool Salvar(mUsuario infoUsuario, char Acao, int Codigo, short Empresa)
        {
            bool retorno = false;
            DbTransaction trans;
            try
            {
                EngineBD.Conectar();
                if (Valida(infoUsuario))
                {                    
                    trans = EngineBD.IniciaTransacao();

                    if (Acao == 'I')
                        retorno = dao.Inserir(infoUsuario);
                    else if (Acao == 'A')
                        retorno = dao.Alterar(infoUsuario);

                    EngineBD.FinalizaTransacao(trans, retorno);
                }
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return retorno;
        }
        public bool Excluir(int Codigo, short Empresa)
        {
            bool retorno = false;
            DbTransaction trans;
            try
            {
                EngineBD.Conectar();
                trans = EngineBD.IniciaTransacao();
                retorno = dao.Excluir(Codigo, Empresa);
                EngineBD.FinalizaTransacao(trans, retorno);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return retorno;
        }
        public mUsuario GetUsuario(int Codigo, short Empresa)
        {
            mUsuario _mUsuario;

            try
            {
                EngineBD.Conectar();
                _mUsuario = dao.GetUsuario(Codigo, Empresa);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return _mUsuario;
        }
        public List<mUsuario> GetLista(short Empresa, bool Administrador = false)
        {
            List<mUsuario> lst = null;

            try
            {
                EngineBD.Conectar();
                lst = dao.GetLista(Empresa, Administrador);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return lst;
        }
        public bool ExisteCadastro()
        {
            bool existe = false;

            try
            {
                EngineBD.Conectar();
                existe = dao.ExisteCadastro();
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return existe;
        }
        public bool ExisteAdministradorCadastro(short Empresa)
        {
            bool existe = false;

            try
            {
                EngineBD.Conectar();
                existe = dao.ExisteAdministradorCadastro(Empresa);
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return existe;
        }
        public bool ValidaUsuario(string Nome, string Senha, short Empresa)
        {
            bool valido = false;

            try
            {
                EngineBD.Conectar();
                valido = dao.ValidaUsuario(Nome, Senha, Empresa);
                if (valido)
                {
                    XMLUsuario.Codigo = dao.Codigo;
                    XMLUsuario.GravaXML();
                }
            }
            finally
            {
                EngineBD.Desconectar();
            }
            return valido;
        }
    }
}
